package cn.woochen.comlib

import android.content.Intent
import android.content.res.Resources
import android.os.Bundle
import android.view.WindowManager
import androidx.appcompat.app.AppCompatActivity
import androidx.databinding.DataBindingUtil
import androidx.databinding.ViewDataBinding
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope
import cn.woochen.comlib.config.IBaseView
import cn.woochen.comlib.loadinglayout.EmptyCallBack
import cn.woochen.comlib.loadinglayout.ErrorCallback
import cn.woochen.comlib.loadinglayout.LoadingHasContentCallBack
import cn.woochen.comlib.util.StatusBarUtil
import com.kingja.loadsir.core.LoadService
import com.kingja.loadsir.core.LoadSir
import kotlinx.coroutines.launch
import java.lang.reflect.ParameterizedType
import java.lang.reflect.Type


/**
 * activity基类(勿修改)
 */
abstract class BaseLibraryActivity<DB : ViewDataBinding, VM : BaseViewModel> : AppCompatActivity(),
    IBaseView {

    protected val mContext by lazy {
        this
    }

    protected lateinit var mBinding: DB
        private set

    lateinit var mViewModel: VM

    protected lateinit var loadService: LoadService<*>

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        window.addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM)
        window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN)
        mBinding = DataBindingUtil.setContentView(this, setContentView())
        mViewModel = createViewModel()
        loadService = LoadSir.getDefault().register(loadingLayout())
//        StatusBarUtil.setStatusBarFullTransparent(this)
        registerNecessaryObserver()
        initListener()
        initData()
    }

    private fun createViewModel(): VM {
        return ViewModelProvider(this)
            .get(getVmClazz(this))
    }

    /**
     * 获取任意对象的泛型信息，返回一个继承了BaseViewModel的字节码对象
     */
    private fun getVmClazz(obj: Any): Class<VM> {
        var cls: Class<*>? = obj.javaClass
        var vmClass: Class<VM>? = null
        while (vmClass == null && cls != null) {
            vmClass = getVMClass(cls)
            cls = cls.superclass
        }
        if (vmClass == null) {
            vmClass = BaseViewModel::class.java as Class<VM>
        }
        return vmClass
    }

    private fun getVMClass(cls: Class<*>): Class<VM>? {
        val type: Type? = cls.genericSuperclass
        if (type is ParameterizedType) {
            val types: Array<Type> = type.actualTypeArguments
            for (t in types) {
                if (t is Class<*>) {
                    if (BaseViewModel::class.java.isAssignableFrom(t)) {
                        return t as Class<VM>
                    }
                } else if (t is ParameterizedType) {
                    val rawType: Type = t.rawType
                    if (rawType is Class<*>) {
                        if (BaseViewModel::class.java.isAssignableFrom(rawType)) {
                            return rawType as Class<VM>
                        }
                    }
                }
            }
        }
        return null
    }

    /**
     * 设置加载布局区域(默认为activity对应xml的根布局)
     */
    protected open fun loadingLayout(): Any {
        return this
    }

    /**
     * 注册必要的观察者
     */
    protected open fun registerNecessaryObserver() {
        lifecycleScope.launch {
            mViewModel.loadingChange.showDialog.collect {
                showLoading(it)
            }
        }
        lifecycleScope.launch {
            mViewModel.loadingChange.dismissDialog.collect {
                showContent()
            }
        }
    }


    /**
     * 设置布局文件
     * @return 布局文件id
     */
    protected abstract fun setContentView(): Int

    /**
     * 初始化监听器
     */
    protected open fun initListener() {}

    /**
     * 网络请求数据
     */
    protected open fun requestData() {}

    /**
     * 初始化数据
     */
    abstract fun initData()


    //  --------------statusbar start--------------
    private var systemType = 0

    /**
     * 设置状态栏风格
     * @param isDark 默认为true，暗色风格，文字为白色(默认)
     */
    fun setStatusBarStyle(isDark: Boolean) {
        if (isDark) {
            StatusBarUtil.StatusBarDarkMode(this, systemType)
        } else {
            systemType = StatusBarUtil.StatusBarLightMode(this)
        }
    }
    //  --------------statusbar end--------------

    //--------------loadingLayout start--------------
    override fun showContent() {
        loadService.showSuccess()
    }

    override fun showEmpty() {
        loadService.showCallback(EmptyCallBack::class.java)
    }

    override fun showLoading(content: String) {
        loadService.showCallback(LoadingHasContentCallBack::class.java)
    }

    override fun showError() {
        loadService.showCallback(ErrorCallback::class.java)
    }
    //--------------loadingLayout end--------------

    override fun onBackPressed() {
        back()
    }

    protected open fun back() {
        if (!isFinishing) {
            finish()
        }
    }

    fun finishAndStartActivity(clazz: Class<*>) {
        val intent = Intent(mContext, clazz)
        mContext.startActivity(intent)
        finish()
    }

}